﻿/*
Copyright (c) 2017 Silan MEMS. All Rights Reserved.
*/

#ifndef SL_Watch_PEDO_KCAL_WRIST_SLEEP_INT_SWAY_ALGO_DRV__H__
#define SL_Watch_PEDO_KCAL_WRIST_SLEEP_INT_SWAY_ALGO_DRV__H__

#define SL_Sensor_Algo_Release_Enable 0x01
//0x00: for debug
//0x01: release version



#define SL_SC7A20_CHIP_ID_ADDR       (unsigned char)0x0F
#define SL_SC7A20_CHIP_ID_VALUE      (unsigned char)0x11
#define SL_SC7A20_VERSION_ADDR       (unsigned char)0x70
#define SL_SC7A20_VERSION_VALUE      (unsigned char)0x11
#define SL_SC7A20E_VERSION_VALUE     (unsigned char)0x26

//typedef enum {FALSE = 0,TRUE = !FALSE} bool;

/********客户需要进行的IIC接口封包函数****************/
extern unsigned char SL_SC7A20_I2c_Spi_Write(unsigned char sl_spi_iic, unsigned char reg, unsigned char dat);
extern unsigned char SL_SC7A20_I2c_Spi_Read(unsigned char sl_spi_iic, unsigned char reg, unsigned char len, unsigned char *buf);
/**SL_SC7A20_I2c_Spi_Write 函数中， sl_spi_iic:0=spi  1=i2c  Reg：寄存器地址   dat：寄存器的配置值*******************/
/**SL_SC7A20_I2c_Spi_Write 函数 是一个单次写的函数*******************************************************************/
/***SL_SC7A20_I2c_Spi_Read 函数中， sl_spi_iic:0=spi  1=i2c Reg 同上，len:读取数据长度，buf:存储数据首地址（指针）***/
/***SL_SC7A20_I2c_Spi_Read 函数 是可以进行单次读或多次连续读取的函数*************************************************/

/*************驱动初始化函数**************/
signed char SL_SC7A20_Driver_Init(unsigned char Sl_spi_iic_init, unsigned char Sl_pull_up_mode, unsigned char sl_addr_auto);
/***输入参数:1,Sl_spi_iic_init:0-1***2,PULL_UP_MODE:0x00 0x08 0x04 0x0c********/
/****Sl_spi_iic_init=0：SPI MODE, Sl_pull_up_mode config failed****************/
/****Sl_spi_iic_init=1：IIC MODE***********************************************/
/****Sl_pull_up_mode=0x00: SDO  I2C  pull up***********************************/
/****Sl_pull_up_mode=0x08: I2C  pull up and  SDO  open drain*******************/
/****Sl_pull_up_mode=0x04: SDO  pull up and  I2C  open drain*******************/
/****Sl_pull_up_mode=0x0C: SDO  I2C  open drain********************************/
/****sl_addr_auto=0: 地址不自增，仅对SC7A20E有效，应用于单地址读取FIFO数据*****/
/****sl_addr_auto=1: 地址自增，仅对SC7A20E有效，应用于多地址读取FIFO数据*******/
/****SDO脚接地，推荐关闭SDO内部上拉电阻****************************************/
/****SPI通讯，推荐关闭SDA，SCL内部上拉电阻，SDO内部上拉电阻会自动关闭**********/
/****SC7A20E/SC7A20ET，推荐sl_addr_auto=0，单地址读取可以节约I2C通讯时的功耗***/

/*************返回数据情况如下*****************/
/**return : 0x11/0x26 表示CHIP ID 正常*********/
/**return : 0         表示读取异常*************/
/**return :-1;        SPI 通信问题*************/
/**return :-2;        IIC 通信问题*************/
/**return :-3;        连续读取 通信问题********/

/***************执行算法前需要读取FIFO数据*****/
/***************FIFO数据读取后，FIFO会清空*****/
/***************所以FIFO只能定时读取一次*******/
unsigned char SL_SC7A20_Read_FIFO(void);
/**return : FIFO_LEN    表示数组长度***********/


/****说明:该函数需要定时执行,从而保证算法执行到位**/
/***************执行算法获取计步结果***************/
unsigned int SL_Watch_Kcal_Pedo_Algo(unsigned char sl_music_motor_en);
/***sl_music_motor_en=0: 马达电机和音乐功能未打开**/
/***sl_music_motor_en=1: 马达电机和音乐功能已打开**/
/**************获取当天的当前计步值****************/
/*************输出数据为：计步值(步)***************/

/***************获取三轴原始数据***************/
unsigned char SL_SC7A20_GET_FIFO_Buf(signed short *sl_x_buf, signed short *sl_y_buf, signed short *sl_z_buf, unsigned char filter_en);
/****************执行算法后执行该命令**********/
/**x_buf  y_buf  z_buf : 长度32的数组首地址****/
/**filter_en：0 低通滤波禁止 1：低通滤波使能***/
/****************返回数据情况如下**************/
/**return : FIFO_LEN    表示数组长度***********/

/***************获取三轴实时数据***************/
void SL_SC7A20_GET_DATA(signed short *sl_x_dat, signed short *sl_y_dat, signed short *sl_z_dat);
/***SC7A20/SC7A20T:    获取上一次读取FIFO的最后一组数据*********/
/***SC7A20E/SC7A20ET:  获取实时数据，且不对FIFO数据产生影响*****/

/******************复位计步值************************/
void SL_Pedo_Kcal_ResetStepCount(void);
/**********输入数据为：无******输出数据为：无********/
/*使用方法: 系统时间到第二天时，调用该函数清除计步值*/

/*******************计步状态复位**********************/
void SL_Pedo_WorkMode_Reset(void);
/******************输入参数：无***********************/
/******************输出值参数：无*********************/

/******************升级后，设置计步值,距离,热量************************/
/******************升级后，请在初始化函数后，增加该函数****************/
void SL_Pedo_StepCount_Set(unsigned int sl_pedo_value, unsigned int sl_dis_value, unsigned int sl_kcal_value);
/**********输入数据为：sl_pedo_value  计步值*****/
/**********输入数据为：sl_dis_value   距离值*****/
/**********输入数据为：sl_kcal_value  热量值*****/

/******************计步灵敏度设置********************/
void SL_PEDO_TH_SET(unsigned char sl_pedo_amp, unsigned char sl_pedo_th, unsigned char sl_pedo_weak, unsigned char sl_zcr_lel, unsigned char sl_scope_lel);
/******sl_pedo_amp>4&&sl_pedo_amp<201**************************/
/******sl_pedo_amp:越小灵敏度越高，越容易计步******************/
/******sl_pedo_amp:越大灵敏度越高，越难计步********************/
/******sl_pedo_amp:默认值26，不设置就是26**********************/

/******sl_pedo_th>5&&sl_pedo_th<50*****************************/
/******sl_pedo_th:越小灵敏度越高，越容易计步*******************/
/******sl_pedo_th:越大灵敏度越高，越难计步*********************/
/******sl_pedo_th:默认值10，不设置就是10***********************/

/******sl_pedo_weak>=0&&sl_pedo_weak<6*************************/
/******sl_pedo_th:0,不打开轻微走路计步功能*********************/
/******sl_pedo_th:1,打开轻微走路计步功能***********************/
/******sl_pedo_th:2,打开轻微走路计步功能***********************/
/******sl_pedo_th:3,打开轻微走路计步功能***********************/
/******sl_pedo_th:4,打开轻微走路计步功能***********************/
/******sl_pedo_th:5,打开轻微走路计步功能***********************/
/******sl_pedo_th:默认值0,设置的值越大，检测计步的越灵敏*******/

/*****sl_zcr_lel>=0&&sl_zcr_lel<=255***************************/
/*****sl_zcr_lel:默认值=20,设置的值越小，越容易屏蔽喇叭震动****/
/*****一定时间内的过零率计算***********************************/

/*****sl_scope_lel>=0&&sl_scope_lel<=255***********************/
/*****整体数据幅度阈值*****************************************/


/*******计步主轴设置****************/
void SL_PEDO_SET_AXIS(unsigned char sl_xyz);
/***sl_xyz:0  x轴*******************/
/***sl_xyz:1  y轴*******************/
/***sl_xyz:2  z轴*******************/
/***sl_xyz:3  算法决定**************/

/***********关闭IIC设备**************/
/***********Power down 函数**********/
/********不使用该设备情况下**********/
/****如需重启，使用驱动初始化函数****/
unsigned char  SL_SC7A20_Power_Down(void);
/*************输入参数:无************/
/**********返回参数情况说明**********/
/**return  1: Power Down Success*****/
/**return  0: Power Down Fail********/




/*************初始化个人参数*************/
/**参数初始化，用于热量，距离计算********/
void SL_Pedo_Person_Inf_Init(unsigned char *Person_Inf_Init);
/*********输入指针参数分别是:身高 体重 年龄 性别***举例:178,60,26 1*********/
/**身高范围:  30cm ~ 250cm  ***********/
/**体重范围:  10Kg ~ 200Kg  ***********/
/**年龄范围:  3岁  ~ 150岁  ***********/
/**性别范围:  0 ~ 1    0:女 1:男   ****/

/*********************获取运动状态值**********************/
unsigned char SL_Pedo_GetMotion_Status(void);
/**********输入数据为：无*********************************/
/**********输出数据为：0 ~ 3 *****************************/
/**输出数据为：0   *静止或静坐**********/
/**输出数据为：1   *慢走或散步**********/
/**输出数据为：2   *正常走路************/
/**输出数据为：3   *跑步或剧烈运动******/

/**************获取截止当前当天的行走距离*****************/
unsigned int SL_Pedo_Step_Get_Distance(void);
/*******************输入数据为：无************************/
/*******************输出数据为：当天行走距离 *************/
/*******************单位:       分米(dm)******************/

/**************获取截止当前当天的热量消耗*****************/
unsigned int SL_Pedo_Step_Get_KCal(void);
/*******************输入数据为：无************************/
/*******************输出数据为：当天热量消耗值 ***********/
/*********单位: 大卡     1个单位=0.1大卡******************/

/**************获取最近一段时间的走路平均幅度*************/
unsigned short SL_Pedo_Step_Get_Avg_Amp(void);
/********************输入数据为：无***********************/
/***********************1LSB≈XXXmg************************/

/***********************获取当前走路平均步频**************/
unsigned char SL_Pedo_Step_Get_Step_Per_Min(void);
/********************输入数据为：无***********************/
/********************输出数据为：XXX步/分钟 **************/

/***********************获取当前的运动等级****************/
unsigned char SL_Pedo_Step_Get_Motion_Degree(void);
/********************输入数据为：无***********************/
/********************输出数据为：0-25 ********************/


/**********抬手亮屏算法**********/

/*****************抬手亮屏算法初始化函数****************/
void SL_Turn_Wrist_Init(unsigned char *SL_Turn_Wrist_Para);
/************输入参数：*************/
/******SL_Turn_Wrist_Para[0]:加速度计贴片位置设置  0--7********/
/******SL_Turn_Wrist_Para[1]:抬手亮屏灵敏度设置    1--5********/
/******SL_Turn_Wrist_Para[2]:水平抬手亮屏使能控制位0--1********/

/*************三轴加速度计贴片位置设置*************************/
/***SL_Turn_Wrist_Para[0]：设定值的范围为: 0 ~ 7 **************/
/***请参考文档:Silan_MEMS_手环算法说明书_V1.1.pdf**************/

/***SL_Turn_Wrist_Para[1]:设定值的范围为: 1 ~ 5 **/
/*********默认值为：3   中等灵敏度****************/
/*********设定值为：1   最低灵敏度****************/
/*********默认值为：5   最高灵敏度****************/
/*********设定值为：1(最迟钝)~5(最灵敏)***********/

/******SL_Turn_Wrist_Para[2]:水平抬手亮屏使能控制位0--1*******/
/******0：禁止水平抬手功能********/
/******1：使能水平抬手功能********/



/*****************抬手亮屏状态获取函数****************/
signed char SL_Watch_Wrist_Algo(void);
/***********输入参数：无***********/
/***********返回参数情况说明*******/
/**Return:  2     备注说明:屏幕点亮后需要关闭*********/
/**Return:  1     备注说明:屏幕需要点亮***************/
/**Return:  0     备注说明:屏幕不需要点亮*************/
/**Return: -1     备注说明:未初始化或初始化失败*******/

/*****************抬手亮屏状态复位********************/
//void SL_Turn_Wrist_WorkMode_Reset(void);
/******************输入参数：无***********************/
/******************输出值参数：无*********************/


//3-12
//1-10
//0-10
/******************睡眠参数设置********************/
void SL_Sleep_Para(unsigned char adom_time_th, unsigned char sleep_vpp_th, unsigned char sleep_time_th);
/**************************佩戴检测的时长***********************/
/******adom_time_th:0-255 min***********************************/
/******adom_time_th:未活动的时间，大于设置阈值才能认为未佩戴****/
/******adom_time_th:设置值越小，越容易出现未佩戴情况************/
/******adom_time_th:255，关闭睡眠时的佩戴检测功能***************/

/**************************睡眠中间点阈值***********************/
/******sleep_vpp_th:越小灵敏度越高，越容易睡眠状态切换**********/
/******sleep_vpp_th:越大灵敏度越低，越难睡眠状态切换************/
/******sleep_vpp_th:默认值10，不设置就是10**********************/

/**************************状态切换最小时间*********************/
/******sleep_time_th:该值越小，睡眠状态切换的所需时间就越短*****/
/******sleep_time_th:该值越大，睡眠状态切换的所需时间就越长*****/
/******sleep_time_th:默认值1，不设置就是1***********************/


/***************获取当前的睡眠状态*****************/
unsigned char SL_Sleep_GetStatus(unsigned char SL_Sys_Time);
/*******SL_Sys_Time：当前的时间，以小时为单位******/
/*******全天的输入时间范围为：0-23 ****************/
/***************输出数据范围：0-7******************/
/***************0：清醒状态************************/
/***************7：深度睡眠************************/

/***************获取当前的活动等级*****************/
unsigned char SL_Sleep_Active_Degree(unsigned char mode);
/***************mode：0 定时器0.5s中调用***********/
/***************mode：1 定时器1min中调用***********/
/***************输出数据范围：0-255****************/
/***************0：静止****************************/
/*************255：运动****************************/

unsigned char SL_Sleep_Get_Active_Degree(void);
/***************mode：0 定时器0.5s中调用***********/
/***************mode：1 定时器1min中调用***********/
/***************输出数据范围：0-255****************/
/***************0：静止****************************/
/*************255：运动****************************/

/***************获取当前的佩戴的情况***************/
unsigned char SL_Adom_GetStatus(void);
/***************0：未佩戴**************************/
/***************1：已佩戴**************************/

/***************获取当前的佩戴的情况***************/
unsigned char SL_In_Sleep_Status(void);
/***************0：out sleep**********************/
/***************1：in sleep***********************/



/*************中断配置参数初始化**********/
void SL_Sc7a20_Int_Config(unsigned char *para);
/***输入数组参数分别是: 中断引脚选择  中断时的电平高低  中断幅度阈值 中断时间阈值****/
/****para[0]****中断引脚选择: 1(中断1 PIN5)  2(中断2 PIN6) **************************/
/****para[1]****进入中断时的电平: 0(中断触发时为低电平) 1(中断触发时为高电平)********/
/****para[2]****中断判断幅度阈值: N=(1~127)  不同量程其含义不同**********************/
/****para[3]****中断判断时间阈值: N=(1~127)  N*1/ODR 单位s***************************/

/*************获取活动等级*****************/
/*获取活动等级，用于判断是否打开传感器中断*/
unsigned char SL_SC7A20_Action_Degree(void);

/***********SC7A20 中断功能打开************/
/*当主控需要进入休眠模式时，需要调用该函数*/
void SL_MCU_SLEEP_OPEN_SC7A20_INT(void);

/***********SC7A20 中断功能关闭************/
/*当主控唤醒后，为了禁止中断触发，需要关闭*/
void SL_MCU_WAKE_CLOSE_SC7A20_INT(void);


/*******close sc7a20 0.5s timer********/
/**用于自定义SC7A20算法定时器关闭函数**/
extern void SL_Close_Sc7a20_Timer(void);

/*******open sc7a20 0.5s timer*********/
/**用于自定义SC7A20算法定时器打开函数**/
extern void SL_Open_Sc7a20_Timer(void);

/**************************翻转功能************************/
unsigned char SL_Get_Clock_Status(unsigned char open_close);
/***********输入参数：sensor_pos***********/
/****sensor_pos:1 open  检测是否要关闭时输入 1*************/
/****sensor_pos:0 close 关闭闹铃时时    输入 0*************/
/*********************返回参数情况说明*********************/
/***********************翻转功能检测***********************/
/**Return:  1     备注说明:屏幕已翻转，关闭闹钟************/
/**Return:  0     备注说明:屏幕未翻转，不关闭闹钟**********/


unsigned char SL_Get_Direction_Status(void);
/*********************返回参数情况说明*********************/
/***********************6个方向检测************************/
/**Return:  0     过渡位置角度*****************************/
/**Return:  1     X=1G 方向成立****************************/
/**Return:  2     X=-1G 方向成立***************************/
/**Return:  3     Y=1G 方向成立****************************/
/**Return:  4     Y=-1G 方向成立***************************/
/**Return:  5     Z=1G 方向成立****************************/
/**Return:  6     Z=-1G 方向成立***************************/


/**************************摇晃功能************************/
unsigned char SL_Get_Phone_Answer_Status(unsigned char Sway_Degree, unsigned char Sway_Num);
/***********输入参数：摇晃等级0--10  摇晃数量0--10***********************/
/***摇晃等级：设置值越小，需要摇晃的幅度越小，越容易触发接听动作*********/
/***摇晃数量：设置值越小，需要摇晃的次数越少，越容易触发接听动作*********/
/***********返回参数情况说明*******************************/
/**Return:  1     备注说明:摇晃动作成立，接听电话**********/
/**Return:  0     备注说明:摇晃动作不成立，不接听电话******/


/************加测项目客户端测试***********/
/***初始化的时候调用用于判断FIFO是否正常**/
unsigned char SL_SC7A20_FIFO_TEST(void);
/*************输入参数:无*****************/
/*************返回数据情况如下************/
/**return :1  FIFO 异常*******************/
/**return :0  FIFO 正常*******************/


/*****加测项目客户端测试 校准XY零漂*******/
unsigned char SL_SC7A20_CAL_FUN(unsigned char *sl_fifo_num, signed char *sl_xy_cal);
/*************输入参数:2*****************************/
/***sl_fifo_num[0]:控制FIFO延时，使得FIFO长度为12****/
/***sl_xy_cal[0]:校准完成时，输出X轴的校准值,需保存**/
/***sl_xy_cal[1]:校准完成时，输出Y轴的校准值,需保存**/
/********return :1  校准完成，<150mg*****************/
/********return :0  校准失败，>150mg*****************/

/*****加测项目 校准XY时使用的延时函数****************/
extern void sl_fifo_delay(void);
/***sl_fifo_num[0]:控制FIFO延时，使得FIFO长度为12****/


/*****加测项目客户端测试 校准XY零漂**********************************/
void SL_SC7A20_CAL_WRITE(signed char sl_x_cal, signed char sl_y_cal);
/********校准后已填写，需要再掉电重启后通过本函数写入校准值**********/
/********sl_x_cal :填写X轴校准值到传感器中***************************/
/********sl_y_cal :填写Y轴校准值到传感器中***************************/


/*****加测项目客户端读取数据保存校准值*******************************/
unsigned char SL_SC7A20_MTP_READ(unsigned char *sl_cal_save_buf);
/**SC7A20 输入参数：数组首地址，要求数组长度30********/
/**SC7A20E输入参数：数组首地址，要求数组长度13********/

/***********SC7A20返回参数情况说明********************/
/**Return:  1     备注说明:15寄存器错误***************/
/**Return:  2     备注说明:16寄存器错误***************/
/**Return:  3     备注说明:屏幕不需要点亮*************/
/**Return: 30     备注说明:校准值正常，可以保存；校准值错误，需要重新写入*******/
/***********SC7A20E返回参数情况说明*******************/
/**Return:  1     备注说明:60寄存器错误***************/
/**Return: 13     备注说明:校准值正常，可以保存；校准值错误，需要重新写入*******/


/*****加测项目客户端判断数据是否正常，异常时需要再次写入************/
unsigned char SL_SC7A20_MTP_WRITE(unsigned char *sl_cal_save_buf);
/**SC7A20 输入参数：数组首地址，要求数组长度30********/
/**SC7A20E输入参数：数组首地址，要求数组长度13********/

/***********返回参数情况说明*******/
/**Return:0 备注说明:写入校准值验证失败，写入失败*****/
/**Return:1 备注说明:写入校准值验证成功，写入成功*****/


/*****使用外部抬手亮屏时，触发抬手功能后调用************/
void SL_Wrist_Fun_Happened(void);
/******无输入参数，无输出参数，用于抑制抬手计步*********/


#endif/****SL_Watch_ALGO_DRV__H__*********/



